Multithreading এবং Grand Central Dispatch (GCD)

Mobile App Development - আইওএস ডেভেলপমেন্ট (iOS)
263

iOS অ্যাপ্লিকেশনে Multithreading এবং Grand Central Dispatch (GCD) হলো অ্যাপের পারফরমেন্স উন্নত করার জন্য গুরুত্বপূর্ণ টেকনিক। Multithreading এর মাধ্যমে আমরা অ্যাপের বিভিন্ন কাজকে আলাদা থ্রেডে চালাতে পারি, যাতে UI রেস্পন্সিভ থাকে এবং অ্যাপ দ্রুত কাজ করতে পারে। GCD হলো Apple এর একটি শক্তিশালী ফ্রেমওয়ার্ক, যা কিউ ম্যানেজমেন্টের মাধ্যমে অ্যাসিনক্রোনাস এবং কনকারেন্ট টাস্ক চালাতে সাহায্য করে।

Multithreading এর ভূমিকা

Multithreading ব্যবহার করে আমরা একটি অ্যাপ্লিকেশনে একাধিক কাজ একসাথে সম্পন্ন করতে পারি। iOS অ্যাপে এটি UI এবং ব্যাকগ্রাউন্ড প্রসেস আলাদা করে পরিচালনা করতে সহায়ক, যেমন:

  • নেটওয়ার্ক রিকোয়েস্ট পরিচালনা করা
  • ব্যাকগ্রাউন্ডে ডেটা প্রসেস করা
  • ফাইল ডাউনলোড করা
  • ইমেজ প্রসেসিং

Grand Central Dispatch (GCD) পরিচিতি

GCD হলো Apple এর একটি low-level API, যা iOS এবং macOS এ টাস্কগুলোকে আলাদা কিউতে রান করতে সহায়ক। এটি efficient এবং রিসোর্স ম্যানেজমেন্টের ক্ষেত্রে উন্নত পারফরমেন্স প্রদান করে। GCD ব্যবহার করে আমরা অ্যাসিনক্রোনাস টাস্ক, কনকারেন্ট অপারেশন, এবং টাইমার কনফিগার করতে পারি।

GCD এর গুরুত্বপূর্ণ টার্ম এবং কনসেপ্ট

  • Dispatch Queue: এটি এমন একটি সিরিজ, যেখানে টাস্কগুলো একের পর এক (সিরিয়াল) বা একসাথে (কনকারেন্ট) রান হয়। GCD এ দুটি ধরনের কিউ আছে:
    • Serial Queue: একটি সিরিয়াল কিউ টাস্কগুলোকে একের পর এক রান করে।
    • Concurrent Queue: একটি কনকারেন্ট কিউ টাস্কগুলোকে একসাথে বা প্যারালালে রান করতে পারে।
  • Main Queue: এটি একটি সিরিয়াল কিউ, যা মুল থ্রেডে (UI থ্রেড) রান হয়। UI আপডেট করতে সবসময় মুল থ্রেডে কাজ করতে হয়।
  • Global Queue: এটি একটি কনকারেন্ট কিউ, যা ব্যাকগ্রাউন্ড টাস্ক বা হেভি প্রসেসিং টাস্ক চালানোর জন্য ব্যবহৃত হয়।
  • Sync এবং Async: GCD এ দুটি অপশন আছে:
    • Sync (Synchronous): টাস্ক কমপ্লিট না হওয়া পর্যন্ত থ্রেড ব্লক থাকে।
    • Async (Asynchronous): টাস্ক চালানো হয় এবং থ্রেড অন্য কাজ চালিয়ে যেতে পারে।

GCD এর উদাহরণ

নিচে কিছু সাধারণ GCD এর উদাহরণ দেখানো হলো, যা Multithreading এবং অ্যাসিনক্রোনাস অপারেশন ম্যানেজ করতে ব্যবহার করা হয়।

১. ব্যাকগ্রাউন্ড কিউতে টাস্ক চালানো

DispatchQueue.global(qos: .background).async {
    // হেভি প্রসেসিং টাস্ক, যেমন: ডেটা প্রসেসিং বা ফাইল ডাউনলোড
    for i in 1...5 {
        print("Background task: \(i)")
    }
    
    // মুল থ্রেডে UI আপডেট করতে DispatchQueue.main.async ব্যবহার করা হয়
    DispatchQueue.main.async {
        print("UI updated on main thread")
    }
}

ব্যাখ্যা:

  • DispatchQueue.global(qos: .background): ব্যাকগ্রাউন্ড কিউতে একটি টাস্ক চালানো হয়েছে, যাতে এটি মুল থ্রেড ব্লক না করে।
  • DispatchQueue.main.async: UI আপডেট মুল থ্রেডে চালানোর জন্য ব্যবহার করা হয়েছে, কারণ UI সম্পর্কিত সকল কাজ মুল থ্রেডে হতে হবে।

২. সিরিয়াল কিউ তৈরি করা এবং ব্যবহারের উদাহরণ

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    for i in 1...3 {
        print("Serial Task 1: \(i)")
    }
}

serialQueue.async {
    for i in 1...3 {
        print("Serial Task 2: \(i)")
    }
}

ব্যাখ্যা:

  • Serial Queue: একটি কাস্টম সিরিয়াল কিউ তৈরি করা হয়েছে, যেখানে টাস্কগুলো একের পর এক রান হবে।
  • টাস্কগুলো async মেথড দিয়ে চালানো হয়েছে, যাতে তারা একের পর এক একসাথে চালানো যায়।

৩. কনকারেন্ট কিউ তৈরি করা এবং ব্যবহারের উদাহরণ

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

concurrentQueue.async {
    for i in 1...3 {
        print("Concurrent Task 1: \(i)")
    }
}

concurrentQueue.async {
    for i in 1...3 {
        print("Concurrent Task 2: \(i)")
    }
}

ব্যাখ্যা:

  • Concurrent Queue: একটি কাস্টম কনকারেন্ট কিউ তৈরি করা হয়েছে, যেখানে টাস্কগুলো প্যারালালে চালানো হবে।
  • async মেথড ব্যবহার করে আমরা কনকারেন্টলি টাস্কগুলো চালাতে পারি, যা ব্যাকগ্রাউন্ড প্রসেসিংয়ের জন্য উপযুক্ত।

৪. Delayed Execution (নির্দিষ্ট সময় পরে টাস্ক চালানো)

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    print("This will run after 2 seconds delay")
}

ব্যাখ্যা:

  • asyncAfter: নির্দিষ্ট সময় পরে একটি টাস্ক চালানোর জন্য asyncAfter ব্যবহার করা হয়েছে। উপরের উদাহরণে, টাস্কটি ২ সেকেন্ড পরে চালানো হবে।

৫. Dispatch Group ব্যবহার করা (Multiple Task Synchronization)

Dispatch Group ব্যবহার করে আমরা একাধিক টাস্ক একত্রে সমন্বয় করতে পারি এবং সবগুলো টাস্ক কমপ্লিট হওয়া পর্যন্ত অপেক্ষা করতে পারি।

let group = DispatchGroup()

group.enter()
DispatchQueue.global().async {
    print("Task 1 started")
    sleep(2)
    print("Task 1 completed")
    group.leave()
}

group.enter()
DispatchQueue.global().async {
    print("Task 2 started")
    sleep(3)
    print("Task 2 completed")
    group.leave()
}

// সবগুলো টাস্ক শেষ হলে একটি কোড ব্লক রান করানো
group.notify(queue: .main) {
    print("All tasks completed")
}

ব্যাখ্যা:

  • DispatchGroup: Dispatch Group ব্যবহার করে টাস্কগুলোকে একত্রে পরিচালনা করা হয়েছে এবং টাস্কগুলো কমপ্লিট হওয়া পর্যন্ত অপেক্ষা করা হয়েছে।
  • enter() এবং leave(): প্রতিটি টাস্ক শুরু হওয়ার আগে enter() এবং শেষে leave() ব্যবহার করা হয়েছে।
  • notify: সব টাস্ক শেষ হলে notify মেথড ব্যবহার করে মুল থ্রেডে একটি কোড ব্লক রান করানো হয়েছে।

GCD এর সেরা চর্চা

  1. Background Queue ব্যবহার করুন: ব্যাকগ্রাউন্ড বা হেভি প্রসেসিং টাস্ক সবসময় ব্যাকগ্রাউন্ড কিউতে চালানো উচিত।
  2. UI কাজ সবসময় Main Queue তে করুন: UI আপডেট বা UI সম্পর্কিত কাজ সবসময় মুল থ্রেডে (Main Queue) চালান।
  3. Dispatch Group ব্যবহার করে Synchronization নিশ্চিত করুন: একাধিক টাস্কের সমন্বয় নিশ্চিত করতে Dispatch Group ব্যবহার করুন।
  4. Deadlock এড়িয়ে চলুন: sync মেথড ব্যবহার করার সময় Deadlock এড়াতে সতর্ক থাকুন।

উপসংহার

Grand Central Dispatch (GCD) একটি শক্তিশালী ফ্রেমওয়ার্ক, যা iOS অ্যাপ্লিকেশনে Multithreading এবং Concurrency ম্যানেজ করতে সাহায্য করে। GCD ব্যবহার করে আমরা ব্যাকগ্রাউন্ড প্রসেসিং, অ্যাসিনক্রোনাস টাস্ক, এবং থ্রেডিং অপ্টিমাইজেশনের মাধ্যমে অ্যাপের পারফরমেন্স উন্নত করতে পারি। iOS ডেভেলপারদের জন্য GCD এর সাথে কাজ করা অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি অ্যাপকে দ্রুত এবং রেসপন্সিভ রাখার জন্য অপরিহার্য।

Content added By

Multithreading এর মৌলিক ধারণা

318

Multithreading হলো প্রোগ্রামিংয়ের একটি কৌশল যেখানে একটি অ্যাপ্লিকেশন একাধিক থ্রেডে বিভক্ত হয়ে একসাথে একাধিক কাজ করতে পারে। iOS অ্যাপে Multithreading ব্যবহার করে অ্যাসিনক্রোনাস টাস্ক (যেমন: নেটওয়ার্ক রিকোয়েস্ট, ডেটা প্রসেসিং, বা ফাইল অপারেশন) ব্যাকগ্রাউন্ডে চালানো হয়, যাতে মেইন থ্রেড বা ইউজার ইন্টারফেস (UI) থ্রেড সাড়া দিতে পারে এবং ব্যবহারকারীকে দ্রুত প্রতিক্রিয়া দিতে পারে।

Multithreading এর মূল উপাদানসমূহ

  • Thread: একটি থ্রেড হলো একটি পৃথক এক্সিকিউশন পাথ যা অ্যাপ্লিকেশন চলাকালীন এক বা একাধিক টাস্ক একসাথে চালাতে পারে। iOS অ্যাপে মেইন থ্রেড এবং ব্যাকগ্রাউন্ড থ্রেডগুলো ব্যবহৃত হয়।
  • Main Thread: এটি হলো অ্যাপ্লিকেশনের প্রধান থ্রেড যেখানে ইউজার ইন্টারফেস (UI) প্রসেস হয়। মেইন থ্রেডে খুব বেশি সময় নেয় এমন কাজ না করাই ভালো, কারণ এটি অ্যাপের UI-কে ব্লক করতে পারে এবং অ্যাপ ল্যাগ বা ফ্রিজ করে ফেলতে পারে।
  • Background Thread: ব্যাকগ্রাউন্ড থ্রেড মূলত ভারী কাজ বা অ্যাসিনক্রোনাস টাস্ক (যেমন নেটওয়ার্ক কল, ডেটা প্রসেসিং) চালানোর জন্য ব্যবহৃত হয়। এটি নিশ্চিত করে যে মেইন থ্রেড ফ্রি থাকে এবং UI সাড়া দিতে পারে।

Multithreading এর সুবিধা

  1. Concurrency: একাধিক টাস্ক একসাথে চালানোর মাধ্যমে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করে।
  2. Responsiveness: ভারী কাজ ব্যাকগ্রাউন্ডে চালিয়ে মেইন থ্রেড ফ্রি রাখা যায়, যাতে UI দ্রুত প্রতিক্রিয়া দিতে পারে।
  3. Efficiency: সঠিকভাবে মেমোরি এবং প্রসেসর রিসোর্স ব্যবহারের মাধ্যমে অ্যাপ্লিকেশন আরও এফিশিয়েন্ট হতে পারে।

Multithreading iOS-এ ব্যবহারের সাধারণ উপায়সমূহ

iOS-এ Multithreading ব্যবহারের জন্য বেশ কয়েকটি টুল এবং ফ্রেমওয়ার্ক রয়েছে:

১. GCD (Grand Central Dispatch)

  • GCD iOS-এ Multithreading ব্যবহারের সবচেয়ে জনপ্রিয় এবং সহজ একটি ফ্রেমওয়ার্ক। এটি টাস্কগুলোকে আলাদা থ্রেডে চালায় এবং অ্যাসিনক্রোনাস কাজ ম্যানেজ করে।
  • DispatchQueue ব্যবহার করে GCD মেইন বা ব্যাকগ্রাউন্ড থ্রেডে কাজ চালাতে পারে।

উদাহরণ: GCD ব্যবহার করে ব্যাকগ্রাউন্ড থ্রেডে কাজ চালানো

DispatchQueue.global(qos: .background).async {
    // ভারী কাজ ব্যাকগ্রাউন্ড থ্রেডে চলছে
    print("Heavy task running in background")
    
    DispatchQueue.main.async {
        // মেইন থ্রেডে UI আপডেট
        print("Updating UI on main thread")
    }
}
  • DispatchQueue.global(qos: .background) ব্যাকগ্রাউন্ড থ্রেডে একটি কাজ চালায়।
  • DispatchQueue.main.async মেইন থ্রেডে ফিরে গিয়ে UI আপডেট করে।

২. Operation এবং OperationQueue

  • Operation এবং OperationQueue আরও কাস্টমাইজড এবং শক্তিশালী Multithreading সমাধান প্রদান করে। এটি GCD-এর উপর ভিত্তি করে কাজ করে, তবে এতে টাস্ক ক্যান্সেল করা, পুনরায় শুরু করা, এবং নির্দিষ্ট ডিপেনডেন্সি যুক্ত করার সুবিধা রয়েছে।

উদাহরণ: OperationQueue ব্যবহার

let operationQueue = OperationQueue()

let operation = BlockOperation {
    print("Task running in background using OperationQueue")
}

operationQueue.addOperation(operation)
  • OperationQueue ব্যাকগ্রাউন্ডে টাস্ক রান করে এবং এটি ম্যানেজ করা সহজ।

Multithreading ব্যবহারের সময় কিছু গুরুত্বপূর্ণ বিষয়

  1. UI Updates: সবসময় মনে রাখতে হবে যে UI আপডেট শুধুমাত্র মেইন থ্রেডে করা যাবে। অন্যথায়, অ্যাপ ক্র্যাশ করতে পারে।
  2. Race Conditions: একাধিক থ্রেড একই রিসোর্স বা মেমোরি অ্যাক্সেস করলে Race Condition তৈরি হতে পারে, যা ডেটা দুর্নীতির কারণ হতে পারে। এটির জন্য synchronization মেকানিজম ব্যবহার করা উচিত।
  3. Deadlocks: থ্রেড একে অপরের জন্য অপেক্ষা করলে Deadlock হতে পারে, যা অ্যাপ্লিকেশনকে ফ্রিজ করে ফেলে। Deadlock এড়াতে সঠিকভাবে কোড ডিজাইন করা উচিত।

Multithreading ব্যবহারের সাধারণ উদাহরণ

ধরা যাক, আমাদের একটি ভারী কাজ রয়েছে, যেমন একটি ইমেজ প্রসেসিং ফাংশন, যা ব্যাকগ্রাউন্ডে চালাতে চাই:

func processImageInBackground() {
    DispatchQueue.global(qos: .userInitiated).async {
        // ভারী ইমেজ প্রসেসিং
        let processedImage = self.heavyImageProcessing()
        
        // মেইন থ্রেডে UI আপডেট
        DispatchQueue.main.async {
            self.imageView.image = processedImage
        }
    }
}
  • এখানে, আমরা ভারী ইমেজ প্রসেসিং কাজটি userInitiated প্রায়োরিটি সহ ব্যাকগ্রাউন্ডে চালাচ্ছি এবং প্রসেসিং শেষ হওয়ার পর মেইন থ্রেডে ফিরে গিয়ে UI আপডেট করছি।

Multithreading এর সেরা চর্চা

  1. Concurrency সঠিকভাবে ম্যানেজ করা: একাধিক থ্রেড চালানোর সময় মনে রাখতে হবে যে প্রতিটি থ্রেড সিস্টেম রিসোর্স ব্যবহার করে।
  2. Synchronization ব্যবহার: একাধিক থ্রেড যদি একই ডেটা ম্যানিপুলেট করে, তবে synchronization মেকানিজম (যেমন: DispatchSemaphore, NSLock) ব্যবহার করা উচিত।
  3. Background Tasks: ভারী কাজ বা নেটওয়ার্ক কল ব্যাকগ্রাউন্ড থ্রেডে চালানো উচিত, যাতে মেইন থ্রেড ফ্রি থাকে এবং UI সাড়া দিতে পারে।
  4. Avoid Overloading the System: বেশি সংখ্যক ব্যাকগ্রাউন্ড থ্রেড চালানো সিস্টেমকে ওভারলোড করতে পারে। তাই যতটা সম্ভব কম থ্রেড ব্যবহার করা উচিত।

উপসংহার

Multithreading ব্যবহার করে iOS অ্যাপে একাধিক কাজ একসাথে চালানো যায়, যা অ্যাপের পারফরম্যান্স এবং ইউজার এক্সপেরিয়েন্স উন্নত করে। GCD এবং OperationQueue ব্যবহার করে সহজে এবং কার্যকরভাবে Multithreading ম্যানেজ করা যায়। তবে, Multithreading ব্যবহারের সময় সঠিক synchronization এবং রিসোর্স ম্যানেজমেন্টের বিষয়গুলি মেনে চলা উচিত।

Content added By

Grand Central Dispatch (GCD) এর ব্যবহার

257

Grand Central Dispatch (GCD) iOS এবং macOS-এ মাল্টি-থ্রেডিং এবং কনকারেন্সি ব্যবস্থাপনার জন্য Apple-এর একটি শক্তিশালী ফ্রেমওয়ার্ক। GCD ব্যবহার করে আমরা সহজেই অ্যাসিনক্রোনাস কাজ করতে পারি, যা অ্যাপের পারফরমেন্স উন্নত করে এবং মেইন থ্রেডকে ব্লক হওয়া থেকে রক্ষা করে। এটি কোডকে বিভিন্ন কিউ (queue) তে পাঠিয়ে এক্সিকিউট করে, যাতে বিভিন্ন কাজ সমান্তরালভাবে বা ধারাবাহিকভাবে সম্পন্ন করা যায়।

GCD কেন ব্যবহার করা হয়?

  • অ্যাসিনক্রোনাস প্রসেসিং: GCD দিয়ে কোড অ্যাসিনক্রোনাসভাবে এক্সিকিউট করা যায়, যা মেইন থ্রেডকে ফ্রি রাখে এবং UI এর রেসপন্সিভনেস বাড়ায়।
  • ব্যাকগ্রাউন্ড টাস্ক: লং-রানিং টাস্ক (যেমন নেটওয়ার্ক রিকোয়েস্ট, ডেটাবেস অপারেশন) ব্যাকগ্রাউন্ডে চালিয়ে রাখা যায়।
  • থ্রেড ম্যানেজমেন্ট: GCD স্বয়ংক্রিয়ভাবে থ্রেড ম্যানেজ করে, তাই ম্যানুয়ালি থ্রেড তৈরি বা ম্যানেজ করার প্রয়োজন হয় না।

GCD কিউ টাইপস

GCD-তে দুটি প্রধান ধরনের কিউ রয়েছে:

  1. Serial Queue: এই কিউ তে কাজগুলো একটির পর একটি ধারাবাহিকভাবে এক্সিকিউট হয়।
  2. Concurrent Queue: এই কিউ তে কাজগুলো একাধিক থ্রেডে সমান্তরালে এক্সিকিউট হয়, ফলে একাধিক কাজ একই সাথে চালানো সম্ভব।

Main Queue

  • Main Queue একটি বিশেষ Serial Queue যা মেইন থ্রেডে চলে এবং সব UI রিলেটেড কাজ এখানে করা হয়।
  • উদাহরণ:
DispatchQueue.main.async {
    // UI রিলেটেড কাজ, যেমন লেবেল আপডেট বা ভিউ পরিবর্তন
}

Global Queue

  • Global Queue হলো Concurrent Queue যা ব্যাকগ্রাউন্ড টাস্কের জন্য ব্যবহৃত হয়। এটি বিভিন্ন QoS (Quality of Service) লেভেলে কাজ করে:
    • userInteractive: মেইন থ্রেডে দ্রুত কাজ করতে হয় এমন টাস্কের জন্য।
    • userInitiated: ইউজার-ইনিশিয়েটেড কাজ যা দ্রুত করতে হয়।
    • utility: লং-রানিং টাস্ক, যেমন ফাইল ডাউনলোড বা ডেটা প্রসেসিং।
    • background: ব্যাকগ্রাউন্ডে কম গুরুত্বপূর্ণ কাজের জন্য।

GCD ব্যবহার করার উদাহরণ

১. অ্যাসিনক্রোনাসভাবে কাজ চালানো

DispatchQueue.global().async {
    // ব্যাকগ্রাউন্ডে একটি কাজ করা
    print("This is running in the background")
    
    // মেইন থ্রেডে ফিরে UI আপডেট করা
    DispatchQueue.main.async {
        print("This is running on the main thread")
    }
}
  • DispatchQueue.global().async ব্যবহার করে একটি টাস্ক ব্যাকগ্রাউন্ডে চালানো হয়েছে।
  • তারপর DispatchQueue.main.async দিয়ে UI রিলেটেড কাজ মেইন থ্রেডে করা হয়েছে।

২. ডিলে (Delay) করে কাজ করা

GCD দিয়ে একটি নির্দিষ্ট সময় পর কাজ এক্সিকিউট করা যায়:

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    print("This will run after 2 seconds")
}
  • এখানে asyncAfter ব্যবহার করে ২ সেকেন্ড পরে কাজ এক্সিকিউট করা হয়েছে।

৩. Custom Serial Queue তৈরি করা

let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
    print("Task 1")
}
serialQueue.async {
    print("Task 2")
}
  • DispatchQueue(label:) ব্যবহার করে একটি Custom Serial Queue তৈরি করা হয়েছে, যেখানে কাজগুলো ক্রমানুসারে এক্সিকিউট হবে।

৪. Custom Concurrent Queue তৈরি করা

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
concurrentQueue.async {
    print("Task 1")
}
concurrentQueue.async {
    print("Task 2")
}
  • এখানে .concurrent অ্যাট্রিবিউট ব্যবহার করে একটি Concurrent Queue তৈরি করা হয়েছে। এই কিউতে কাজগুলো সমান্তরালে এক্সিকিউট হবে।

Dispatch Group

Dispatch Group ব্যবহার করে একাধিক অ্যাসিনক্রোনাস টাস্ককে গ্রুপ করা যায় এবং সব টাস্ক শেষ হলে একটি কাজ এক্সিকিউট করা যায়।

Dispatch Group এর উদাহরণ

let group = DispatchGroup()

group.enter()
DispatchQueue.global().async {
    // Task 1
    print("Task 1 started")
    sleep(2) // Task duration simulation
    print("Task 1 finished")
    group.leave()
}

group.enter()
DispatchQueue.global().async {
    // Task 2
    print("Task 2 started")
    sleep(3) // Task duration simulation
    print("Task 2 finished")
    group.leave()
}

// সব টাস্ক শেষ হলে কলব্যাক
group.notify(queue: DispatchQueue.main) {
    print("All tasks are completed")
}
  • DispatchGroup এর মাধ্যমে দুটি অ্যাসিনক্রোনাস টাস্ক গ্রুপ করা হয়েছে।
  • group.enter() এবং group.leave() ব্যবহার করে টাস্কের শুরু এবং শেষ নির্ধারণ করা হয়েছে।
  • group.notify দিয়ে সব টাস্ক শেষ হওয়ার পর মেইন থ্রেডে একটি কাজ এক্সিকিউট করা হয়েছে।

Dispatch Barrier

Dispatch Barrier ব্যবহার করে Concurrent Queue-তে ক্রিটিক্যাল সেকশন তৈরি করা যায়, যেখানে এক সময় একটিমাত্র টাস্ক এক্সিকিউট হবে।

Dispatch Barrier এর উদাহরণ

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

concurrentQueue.async {
    print("Task 1")
}

concurrentQueue.async(flags: .barrier) {
    print("This is a barrier task")
}

concurrentQueue.async {
    print("Task 2")
}
  • .barrier ফ্ল্যাগ ব্যবহার করে একটি Barrier Task তৈরি করা হয়েছে। এটি অন্য সব টাস্ক বন্ধ করে একা এক্সিকিউট হয়।

Dispatch Semaphore

Dispatch Semaphore ব্যবহার করে কনকারেন্ট এক্সিকিউশন কন্ট্রোল করা যায়। এটি থ্রেড সিঙ্ক্রোনাইজেশন করতে ব্যবহৃত হয়।

Dispatch Semaphore এর উদাহরণ

let semaphore = DispatchSemaphore(value: 1)

DispatchQueue.global().async {
    semaphore.wait()
    print("Task 1 started")
    sleep(2)
    print("Task 1 finished")
    semaphore.signal()
}

DispatchQueue.global().async {
    semaphore.wait()
    print("Task 2 started")
    sleep(1)
    print("Task 2 finished")
    semaphore.signal()
}
  • DispatchSemaphore দিয়ে দুটি টাস্কের সিঙ্ক্রোনাইজেশন করা হয়েছে যাতে একটি টাস্ক শেষ না হওয়া পর্যন্ত অন্যটি শুরু না হয়।

উপসংহার

  • GCD একটি শক্তিশালী টুল যা iOS এবং macOS অ্যাপ্লিকেশন ডেভেলপমেন্টে মাল্টি-থ্রেডিং ম্যানেজ করতে ব্যবহৃত হয়।
  • Serial এবং Concurrent Queue, Dispatch Group, Barrier, এবং Semaphore এর মাধ্যমে সহজে অ্যাসিনক্রোনাস প্রোগ্রামিং করা যায়।
  • GCD ব্যবহার করে অ্যাপের পারফরমেন্স উন্নত করা এবং UI রেসপন্সিভ রাখা যায়।
Content added By

Background Tasks এবং Concurrent Programming

260

iOS অ্যাপ্লিকেশনে Background Tasks এবং Concurrent Programming হলো গুরুত্বপূর্ণ টেকনিক, যা ব্যবহার করে অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে কাজ চালাতে পারে এবং পারফরমেন্স উন্নত করে। iOS এ, Background Tasks সাধারণত ব্যাকগ্রাউন্ডে লং-রানিং টাস্ক, নেটওয়ার্ক রিকোয়েস্ট, ফাইল ডাউনলোড বা আপলোড, এবং অন্যান্য হেভি প্রসেসিং অপারেশন পরিচালনা করতে ব্যবহৃত হয়। Concurrent Programming এর মাধ্যমে আমরা একই সাথে একাধিক টাস্ক চালাতে পারি, যা অ্যাপ্লিকেশনের রেসপন্সিভনেস এবং পারফরমেন্স বৃদ্ধি করে।

Background Tasks

iOS এ Background Tasks ব্যবহার করার জন্য Apple কয়েকটি টেকনোলজি এবং API প্রদান করেছে, যা ব্যাকগ্রাউন্ডে কাজ করতে সহায়ক:

  1. Background Fetch: এটি একটি ব্যাকগ্রাউন্ড মেকানিজম, যা ব্যাকগ্রাউন্ডে ডেটা রিফ্রেশ করে। এটি এমন অ্যাপগুলির জন্য উপযুক্ত যেগুলো নির্দিষ্ট সময় অন্তর ডেটা আপডেট করে, যেমন: নিউজ ফিড।
  2. URLSession Background Configuration: iOS এ URLSession API ব্যাকগ্রাউন্ডে ফাইল ডাউনলোড এবং আপলোড পরিচালনা করতে পারে। এটি বড় ফাইল বা লং-রানিং ডাউনলোড/আপলোডের জন্য উপযুক্ত।
  3. BGTaskScheduler: iOS 13 থেকে, Apple BGTaskScheduler API প্রদান করেছে, যা ব্যাকগ্রাউন্ডে কাজ পরিচালনা করতে এবং শিডিউল করতে সহায়ক। এটি ব্যাটারি এবং রিসোর্সের ওপর ভিত্তি করে টাস্ক শিডিউল করে।
  4. Silent Push Notifications: Silent Push Notifications এর মাধ্যমে সার্ভার থেকে অ্যাপকে ব্যাকগ্রাউন্ডে ডেটা আপডেট করার নির্দেশ দেয়া যেতে পারে, ব্যবহারকারীর নোটিফিকেশন ছাড়াই।

উদাহরণ: Background Fetch ব্যবহার করা

Background Fetch কনফিগার করার জন্য কিছু স্টেপ ফলো করতে হবে:

Step 1: Background Mode সক্ষম করা

Xcode এ Capabilities ট্যাব থেকে Background Modes চালু করুন এবং Background Fetch অপশনটি সিলেক্ট করুন।

Step 2: App Delegate এ কনফিগার করা

Background Fetch কনফিগার করতে AppDelegate এ নিচের মতো কোড যোগ করুন:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Background Fetch এর জন্য ইন্টারভাল সেট করা
        application.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum)
        return true
    }
    
    func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        // ডেটা ফেচ বা আপডেট করা
        fetchDataInBackground { newData in
            if newData {
                completionHandler(.newData)
            } else {
                completionHandler(.noData)
            }
        }
    }
    
    // ব্যাকগ্রাউন্ডে ডেটা ফেচ করার একটি ফাংশন
    func fetchDataInBackground(completion: @escaping (Bool) -> Void) {
        // এখানে নেটওয়ার্ক রিকোয়েস্ট বা ডেটা প্রসেসিং যুক্ত করুন
        completion(true) // এখানে নতুন ডেটা এসেছে কিনা তা রিটার্ন করুন
    }
}

ব্যাখ্যা:

  • setMinimumBackgroundFetchInterval: এই মেথড দিয়ে Background Fetch ইন্টারভাল সেট করা হয়।
  • performFetchWithCompletionHandler: এটি ব্যাকগ্রাউন্ডে ফেচ টাস্ক চালানোর জন্য ব্যবহৃত হয়। এখানে আমরা fetchDataInBackground ফাংশন কল করেছি।

উদাহরণ: URLSession দিয়ে Background Download

iOS এ URLSession ব্যবহার করে বড় ফাইল ডাউনলোড করতে হলে Background Configuration ব্যবহার করা হয়:

import UIKit

class DownloadManager: NSObject, URLSessionDownloadDelegate {
    var downloadSession: URLSession!
    
    override init() {
        super.init()
        let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.download")
        downloadSession = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    }
    
    func startDownload() {
        guard let url = URL(string: "https://example.com/largefile.zip") else { return }
        let downloadTask = downloadSession.downloadTask(with: url)
        downloadTask.resume()
    }
    
    // URLSession Download Delegate মেথড
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        print("Download completed: \(location)")
        // ফাইল প্রক্রিয়াকরণ বা সংরক্ষণ করুন
    }
}

ব্যাখ্যা:

  • Background Configuration: URLSessionConfiguration.background ব্যবহার করে একটি ব্যাকগ্রাউন্ড সেশন কনফিগার করা হয়েছে।
  • startDownload: ডাউনলোড শুরু করার জন্য একটি ফাংশন।
  • Delegate মেথড: ডাউনলোড কমপ্লিট হলে urlSession(_:downloadTask:didFinishDownloadingTo:) মেথড ট্রিগার হয়।

BGTaskScheduler ব্যবহার করে Background Processing

iOS 13 থেকে, Apple BGTaskScheduler API প্রদান করেছে, যা ব্যাকগ্রাউন্ডে লং-রানিং টাস্ক পরিচালনা করতে সহায়ক। এটি ব্যাটারি এবং রিসোর্স ব্যবস্থাপনার সাথে কাজ করে।

Step 1: Info.plist এ সেটআপ করা

Info.plist এ নিচের এন্ট্রি যুক্ত করুন:

  • BGTaskSchedulerPermittedIdentifiers হিসেবে আপনার টাস্ক আইডেন্টিফায়ার যোগ করুন, যেমন: com.example.refresh.

Step 2: BGTaskScheduler সেটআপ করা

import BackgroundTasks

func scheduleAppRefresh() {
    let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
    request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) // 15 মিনিট পরে
    
    do {
        try BGTaskScheduler.shared.submit(request)
    } catch {
        print("Failed to schedule app refresh: \(error)")
    }
}

func handleAppRefresh(task: BGAppRefreshTask) {
    scheduleAppRefresh() // পুনরায় শিডিউল করা
    
    // ব্যাকগ্রাউন্ডে ডেটা ফেচ
    fetchDataInBackground { success in
        task.setTaskCompleted(success: success)
    }
}

func fetchDataInBackground(completion: @escaping (Bool) -> Void) {
    // নেটওয়ার্ক কল বা ডেটা প্রসেসিং
    completion(true)
}

Concurrent Programming: Multithreading এবং GCD ব্যবহার করে

Concurrent Programming এর মাধ্যমে আমরা একসাথে একাধিক টাস্ক চালাতে পারি। GCD (Grand Central Dispatch) হলো এর প্রধান উপায়। নিচে উদাহরণ দেওয়া হলো:

উদাহরণ: Concurrent Queue এ টাস্ক চালানো

let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)

concurrentQueue.async {
    for i in 1...5 {
        print("Concurrent Task 1: \(i)")
    }
}

concurrentQueue.async {
    for i in 1...5 {
        print("Concurrent Task 2: \(i)")
    }
}

ব্যাখ্যা:

  • Concurrent Queue: এটি একসাথে একাধিক টাস্ক চালায়।
  • async: টাস্কগুলো প্যারালালে একসাথে চালানো হয়।

GCD ব্যবহার করে Operation Queues

iOS এ Operation Queues আরও উচ্চ স্তরের টাস্ক ম্যানেজমেন্ট প্রদান করে, যা GCD এর উপরে নির্মিত। এটি নির্ভরতা (dependencies) এবং কাস্টম কনকারেন্সি পরিচালনা করতে পারে।

উদাহরণ: Operation Queue ব্যবহার করা

let operationQueue = OperationQueue()

let operation1 = BlockOperation {
    print("Operation 1 started")
    sleep(2)
    print("Operation 1 finished")
}

let operation2 = BlockOperation {
    print("Operation 2 started")
    sleep(1)
    print("Operation 2 finished")
}

// operation2 কে operation1 এর উপর নির্ভরশীল করা
operation2.addDependency(operation1)

operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)

ব্যাখ্যা:

  • BlockOperation: দুটি ব্লক অপারেশন তৈরি করা হয়েছে।
  • Dependency: operation2 কে operation1 এর উপর নির্ভরশীল করা হয়েছে, তাই operation1 শেষ না হলে operation2 শুরু হবে না।

Background Tasks এবং Concurrent Programming এর সেরা চর্চা

  1. Main Queue এবং Background Queue আলাদা করুন: ব্যাকগ্রাউন্ড প্রসেসিং সবসময় ব্যাকগ্রাউন্ড কিউতে করুন এবং UI আপডেট সবসময় মুল থ্রেডে করুন।
  2. Error Handling নিশ্চিত করুন: ব্যাকগ্রাউন্ড টাস্কে এরর হ্যান্ডলিং নিশ্চিত করুন এবং প্রয়োজনমতো রিট্রাই লজিক ব্যবহার করুন।
  3. Battery এবং Resource Optimization: ব্যাকগ্রাউন্ড টাস্কে ব্যাটারি এবং রিসোর্স ম্যানেজমেন্টের জন্য BGTaskScheduler ব্যবহার করুন।
  4. Efficient Data Fetching: Background Fetch বা Silent Push Notifications ব্যবহার করে ব্যাকগ্রাউন্ডে ডেটা রিফ্রেশ করুন।

উপসংহার

iOS এ Background Tasks এবং Concurrent Programming ব্যবহার করে অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে কাজ করতে এবং পারফরমেন্স উন্নত করতে পারা যায়। GCD, URLSession, এবং BGTaskScheduler ব্যবহার করে ডেভেলপাররা ব্যাকগ্রাউন্ড এবং কনকারেন্ট টাস্ক ম্যানেজ করতে পারেন, যা অ্যাপকে আরও রেসপন্সিভ এবং পারফরমেন্স-ওরিয়েন্টেড করে তোলে।

Content added By

NSOperation এবং NSOperationQueue

289

NSOperation এবং NSOperationQueue iOS অ্যাপে Multithreading এবং Concurrency ব্যবহারের একটি শক্তিশালী টুল। এগুলো Grand Central Dispatch (GCD) এর উপর ভিত্তি করে তৈরি হলেও, আরও কাস্টমাইজড এবং ব্যবস্থাপনা সহজ এমন একটি পদ্ধতি প্রদান করে। NSOperation হলো একটি অ্যাবস্ট্রাকশন, যা এক বা একাধিক টাস্ক বা কাজকে রিপ্রেজেন্ট করে, এবং NSOperationQueue হলো এমন একটি কনটেইনার, যা NSOperation-এর কাজগুলোকে নির্দিষ্টভাবে ম্যানেজ করে এবং এক্সিকিউট করে।

NSOperation এবং NSOperationQueue কী?

  • NSOperation: এটি একটি অ্যাবস্ট্রাক্ট ক্লাস, যা একটি ইউনিট অফ ওয়ার্ক বা কাজকে রিপ্রেজেন্ট করে। NSOperation এর সাবক্লাস বা ব্লক নির্ভর মেথড ব্যবহার করে এটি কাস্টমাইজ করা যায়।
  • NSOperationQueue: এটি একটি কিউ (Queue), যেখানে একাধিক NSOperation যোগ করে একসাথে ম্যানেজ করা যায়। এটি অপারেশনগুলিকে ব্যাকগ্রাউন্ড থ্রেডে অ্যাসিনক্রোনাসভাবে চালায় এবং কিউ-তে অ্যাড করা অপারেশনগুলিকে সঠিক অর্ডারে প্রসেস করে।

NSOperation এর ধরন

  • BlockOperation: একটি সাবক্লাস যা ব্লক ভিত্তিক কাজ (task) চালাতে পারে। এটি NSOperation-এর সহজ এবং দ্রুততম ইমপ্লিমেন্টেশন।
  • Custom NSOperation: কাস্টম সাবক্লাস তৈরি করে আপনি নিজের লজিক বা কাজ যুক্ত করতে পারেন, যেমন: ডেটা প্রসেসিং বা নেটওয়ার্ক কল।

NSOperation ব্যবহার করার উদাহরণ

BlockOperation উদাহরণ

let operation = BlockOperation {
    print("Task running in background")
}
operation.start()
  • BlockOperation ব্যবহার করে, আমরা সহজেই ব্যাকগ্রাউন্ডে একটি কাজ চালাতে পারি।
  • start() মেথড কল করে আমরা অপারেশনটি শুরু করতে পারি।

NSOperationQueue ব্যবহার করার উদাহরণ

NSOperationQueue ব্যবহার করে একাধিক অপারেশন ম্যানেজ করা যায় এবং সেগুলো ব্যাকগ্রাউন্ড থ্রেডে চালানো যায়।

let operationQueue = OperationQueue()

let operation1 = BlockOperation {
    print("Operation 1 running in background")
}

let operation2 = BlockOperation {
    print("Operation 2 running in background")
}

// OperationQueue এ অপারেশন যোগ করা
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
  • এখানে, operationQueue একটি NSOperationQueue যা ব্যাকগ্রাউন্ড থ্রেডে operation1 এবং operation2 এক্সিকিউট করছে।

Operation Dependencies

NSOperation এ কাজের মধ্যে ডিপেনডেন্সি যোগ করা যায়, অর্থাৎ একটি কাজ শেষ হওয়ার পরে আরেকটি কাজ শুরু হতে পারে।

let operation1 = BlockOperation {
    print("Fetching data...")
}

let operation2 = BlockOperation {
    print("Processing data...")
}

// operation2, operation1 এর উপর নির্ভরশীল
operation2.addDependency(operation1)

let queue = OperationQueue()
queue.addOperation(operation1)
queue.addOperation(operation2)
  • addDependency মেথড ব্যবহার করে আমরা নির্দিষ্ট করতে পারি যে operation2 কেবলমাত্র operation1 শেষ হওয়ার পরে শুরু হবে।

Custom NSOperation তৈরি করা

BlockOperation ছাড়াও, আমরা NSOperation এর কাস্টম সাবক্লাস তৈরি করে আরও জটিল কাজ ম্যানেজ করতে পারি।

class CustomOperation: Operation {
    override func main() {
        if isCancelled {
            return
        }
        print("Custom operation running")
        
        // ভারী কাজ শুরু করা
        if isCancelled {
            return
        }
        print("Heavy task completed")
    }
}

let customOperation = CustomOperation()
let queue = OperationQueue()
queue.addOperation(customOperation)
  • এখানে, CustomOperation একটি কাস্টম NSOperation যা main() মেথডে নির্দিষ্ট কাজ এক্সিকিউট করছে।
  • isCancelled চেক করে নিশ্চিত করা হচ্ছে যে, অপারেশনটি ক্যান্সেল করা হলে সেটি বন্ধ হয়ে যাবে।

NSOperation এর সুবিধা

  1. Dependencies Management: NSOperation-এ অপারেশনগুলোর মধ্যে ডিপেনডেন্সি সেট করা যায়, যা কাজগুলোকে নির্দিষ্ট ক্রমে চালাতে সাহায্য করে।
  2. KVO (Key-Value Observing): NSOperation বিভিন্ন স্টেট (যেমন: isReady, isExecuting, isFinished) ট্র্যাক করে। এটি কিভাবে এবং কখন একটি অপারেশন শেষ হয়েছে তা জানতে সাহায্য করে।
  3. Cancellation Support: NSOperation ক্যান্সেল করা যায়, যা নির্দিষ্ট অপারেশন বন্ধ করার সুযোগ দেয়। অপারেশন চালানোর সময় isCancelled চেক করে এই ফিচার ব্যবহার করা যায়।
  4. Thread Management: NSOperationQueue স্বয়ংক্রিয়ভাবে ব্যাকগ্রাউন্ড থ্রেড তৈরি করে, যা ম্যানুয়ালি থ্রেড তৈরি করার চেয়ে অনেক বেশি কার্যকর।

NSOperationQueue এর ধরনের কনফিগারেশন

  • Max Concurrent Operation Count: NSOperationQueue-তে কতো সংখ্যক অপারেশন একসাথে চালানো যাবে তা নির্ধারণ করা যায়।
queue.maxConcurrentOperationCount = 2
  • Priority: অপারেশনগুলোর প্রায়োরিটি নির্ধারণ করা যায় (উচ্চ, নিম্ন, বা স্বাভাবিক প্রায়োরিটি)।
operation1.queuePriority = .high

Multithreading ব্যবহারের সুবিধা

  1. Concurrency ম্যানেজমেন্ট: একাধিক থ্রেড একসাথে ব্যবহার করে অ্যাপ্লিকেশনের কার্যকারিতা বৃদ্ধি করে।
  2. UI Responsiveness: ভারী কাজ ব্যাকগ্রাউন্ডে চালিয়ে UI ফ্রিজ হওয়ার সমস্যা এড়ানো যায়।
  3. Efficient Resource Management: ব্যাকগ্রাউন্ডে অপারেশন ম্যানেজ করে iOS ডিভাইসে CPU এবং মেমোরি ব্যবহার অপ্টিমাইজ করা হয়।

উপসংহার

NSOperation এবং NSOperationQueue iOS-এ Multithreading ম্যানেজমেন্টের একটি শক্তিশালী এবং কাস্টমাইজড পদ্ধতি। এটি ডিপেনডেন্সি ম্যানেজমেন্ট, ক্যান্সেলেশন সাপোর্ট, এবং কাস্টমাইজেশন করার সুযোগ দেয়, যা জটিল কাজগুলিকে কার্যকরভাবে এবং সুষ্ঠুভাবে সম্পাদন করতে সাহায্য করে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...